'use strict';

module.exports = index;
const path = require('path')
const semver = require('semver');
const colors = require('colors/safe');
const pkg = require('../package.json');
const log = require('@liangshaojie/log');
// 清除用的
const clean = require('@liangshaojie/clean');
// 执行命令用的
const exec = require('@liangshaojie/exec');
// 发布
const publish = require('@liangshaojie/publish');
// 注册命令用的
const commander = require('commander');
// 用户家目录用的
const userHome = require('user-home');
// 判断目录是否存在
const pathExists = require('path-exists').sync;
// 实例化
const program = new commander.Command();

const DEPENDENCIES_DIR = "dependencies"
const DEFAULT_CLI_HOME = '.pk-lsj-cli'

// 主流程开始  两件事情一个是准备解决段，一个是注册命令
async function index() {
    try {
        await prepare()
        registerCommand();
    } catch (e) {
        console.log(e)
    }
}
// 注册命令
function registerCommand() {
    program
        .name(Object.keys(pkg.bin)[0])
        .usage('<command> [options]')
        .version(pkg.version)
        .option('-d, --debug', '是否开启调试模式', false)
        .option('-tp, --targetPath <targetPath>', '是否指定本地调试文件路径', '');

    program
        .command('info')
        .description('pk-lsj-cli基本信息')
        .action(() => {
            log.success('基本信息', '1，提高开发效率');
            log.success('基本信息', '2，减少重复的git操作');
            log.success('基本信息', '3，自动化发布流程');
        });

    program
        .command('init [projectName]')
        .description('项目初始化')
        .option('--packagePath <packagePath>', '手动指定init包路径')
        .option('-f, --force', '覆盖当前路径文件（谨慎使用）')
        .action(exec);

    program
        .command('publish')
        .description('项目发布')
        .option('--packagePath <packagePath>', '手动指定publish包路径')
        .option('--refreshToken', '强制更新git token信息')
        .option('--refreshOwner', '强制更新git owner信息')
        .option('--refreshServer', '强制更新git server信息')
        .option('--force', '强制更新所有缓存信息')
        .option('--prod', '正式发布')
        .option('--keepCache', '保留缓存')
        .option('--cnpm', '使用cnpm')
        .option('--buildCmd <buildCmd>', '手动指定build命令')
        .option('--sshUser <sshUser>', '模板服务端用户名')
        .option('--sshIp <sshIp>', '模板服务器IP或域名')
        .option('--sshPath <sshPath>', '模板服务器上传路径')
        .action(publish)

    program
        .command('clean')
        .description('清空缓存文件')
        .option('-a, --all', '清空全部')
        .option('-p, --dep', '清空依赖文件')
        .action(clean)


    // 开启debug模式
    program.on('option:debug', function () {
        process.env.LOG_LEVEL = 'verbose';
        log.level = process.env.LOG_LEVEL;
    });

    // 对未知命令监听
    program.on('command:*', function (obj) {
        const availableCommands = program.commands.map(cmd => cmd.name());
        console.log(colors.red('未知的命令：' + obj[0]));
        if (availableCommands.length > 0) {
            console.log(colors.red('可用命令：' + availableCommands.join(',')));
        }
    });

    // 指定targetPath
    program.on('option:targetPath', function (targetPath) {
        process.env.CLI_TARGET_PATH = targetPath;
    });

    program.parse(process.argv);

    if (program.args && program.args.length < 1) {
        program.outputHelp();
        console.log();
    }
}

// 准备阶段
async function prepare() {
    checkPkgVersion();
    checkRoot();
    checkUserHome()
    checkEnv();
    await checkGlobalUpdate();
}

// 检查更新全局cli包
async function checkGlobalUpdate() {
    const currentVersion = pkg.version;
    const npmName = pkg.name;
    const {getNpmSemverVersion} = require('@liangshaojie/get-npm-info');
    const lastVersion = await getNpmSemverVersion(currentVersion, npmName);
    if (lastVersion && semver.gt(lastVersion, currentVersion)) {
        log.warn('cli', colors.yellow(`请手动更新 ${npmName}，当前版本：${currentVersion}，最新版本：${lastVersion}
                更新命令： npm install -g ${npmName}`));
    }
}


// 检查版本package中的版本
function checkPkgVersion() {
    log.info('cli', pkg.version);
}

// 检查是否是root用户
function checkRoot() {
    const rootChek = require('root-check');
    rootChek()
}

// 检查环境 如果家目录下面有.env文件读取配置，加载到当前环境变量中去
function checkEnv() {
    const dotenv = require('dotenv');
    const dotenvPath = path.resolve(userHome, '.env');
    if (pathExists(dotenvPath)) {
        // 设置dotenv的path
        const res = dotenv.config({
            path: dotenvPath,
        });
        log.info('evn变量', JSON.stringify(res.parsed));
    }
    createDefaultConfig();
}

// 最终生成这样的环境变量
// PROJECT: 'TESTAPP',
// USER_HOME: '/Users/lsj',
// DEPENDENCIES_DIR: 'dependencies',
// CLI_HOME_PATH: '/Users/lsj/.pk-lsj-cli'
// 生成默认配置
function createDefaultConfig() {
    // 设置环境变量
    process.env.USER_HOME = userHome;
    // 设置依赖目录
    process.env.DEPENDENCIES_DIR = DEPENDENCIES_DIR;
    // 设置缓存家目录
    if (process.env.CLI_HOME) {
        process.env.CLI_HOME_PATH = path.join(userHome, process.env.CLI_HOME);
    } else {
        process.env.CLI_HOME_PATH = path.join(userHome, DEFAULT_CLI_HOME);
    }
}

// 检查家目录
function checkUserHome() {
    log.info('当前的家目录是：', userHome);
    if (!userHome || !pathExists(userHome)) {
        throw new Error(colors.red('当前登录用户主目录不存在！'));
    }
}


